package com.pactera.madp.cp.service.sync.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.pactera.madp.cp.api.dto.sync.SyncDTO;
import com.pactera.madp.cp.api.entity.sync.MaTodayDataBoardEntity;
import com.pactera.madp.cp.api.entity.sync.MaTotalDataBoardEntity;
import com.pactera.madp.cp.api.entity.sync.SyncEventEntity;
import com.pactera.madp.cp.service.sync.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @title 神策-日间同步-采集明细数据-业务处理实现
 *   - ① 处理同步参数(上一次同步时间最大接收时间)
 *   - ② 同步神策采集明细数据
 *   - ③ 汇总当日访客浏览数据
 *   - ④ 处理客户雷达数据
 *   - ⑤ 同步神策访客浏览汇总数据
 * @date 2022-05-13
 * @author Deming.Chang
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class SyncSaDayTimeServiceImpl implements SyncSaDayTimeService {

    /**
     * 神策平台-请求神策API-服务接口
     */
    private final SaClientService clientService;

    /**
     * 数据采集事件实现[对接入库]
     */
    private final SyncEventService eventService;

    /**
     * 当日数据看板数据统计实现
     */
    private final MaTodayDataBoardService todayDataBoardService;

    /**
     * 汇总数据看板数据统计实现
     */
    private final MaTotalDataBoardService totalDataBoardService;

    /**
     * 客户雷达处理实现
     */
    private final MaRadarService radarService;

    /**
     * ① 处理同步参数(上一次同步时间最大接收时间)
     * @param dto   同步参数
     * @return  本系统采集事件表上一次同步最大接收时间
     */
    @Override
    public Long handleSyncParams(SyncDTO dto) {
        Map<String, Object> params = dto.getParams();
        Long receiveTime = MapUtil.getLong(params, PARAM_KEY_RECEIVE_TIME);
        if (CollUtil.isEmpty(params) || ObjectUtil.isNull(receiveTime)) {
            receiveTime = eventService.getOneLastMaxReceiveTime();
        }
        log.info("--->Ma 1、处理同步参数(上一次同步最大接收时间:{})<---", receiveTime);
        return receiveTime;
    }

    /**
     * ② 同步神策采集明细数据
     * @return 返回上一次同步最大接收时间
     */
    @Override
    public Boolean syncSaDetails(Long lastMaxReceiveTime) {
        log.info("--->Ma 2、开始同步神策采集明细数据<---");
        List<SyncEventEntity> entities  = clientService.getSaEvents(lastMaxReceiveTime);
        if(CollUtil.isNotEmpty(entities)){
            log.info("--->Ma 2、神策采集明细数据:{}条,进行同步<---", entities.size());
            eventService.saveOrUpdateBatch(entities);
            log.info("--->Ma 2、结束同步神策采集明细数据<---");
            return Boolean.TRUE;
        }
        log.info("--->Ma 2、神策采集明细数据:0条,无需同步<---");
        log.info("--->Ma 2、结束同步神策采集明细数据<---");
        return Boolean.FALSE;
    }

    /**
     * ③ 汇总当日访客浏览数据
     * @date 2022-05-21 修正
     * @notice: 此处不能传递上次最大接收时间，如当日无数据，则会获取昨日最大接收时间，导致汇总数据日期数据异常
     * @notice: 追数不会追历史日期当前数据，业务逻辑上只要当天（今天）数据即可。
     */
    @Override
    public void summarySyncEvents(){
        log.info("--->Ma 3、开始汇总当日访客浏览数据<---");
        List<MaTodayDataBoardEntity> entities = eventService.getRecommendBoard(DateUtil.today());
        log.info("--->Ma 3、汇总当日访客浏览数据：{}条<---", entities.size());
        if(CollUtil.isNotEmpty(entities)) {
            todayDataBoardService.saveOrUpdateBatch(entities);
        }
        log.info("--->Ma 3、结束汇总当日访客浏览数据<---");
    }

    /**
     * ④ 处理客户雷达数据
     */
    @Override
    public void handlerRadar(Long lastMaxReceiveTime) {
        log.info("--->Ma 4、开始处理客户雷达数据<---");
        radarService.handlerAndSave(lastMaxReceiveTime);
        log.info("--->Ma 4、结束处理客户雷达数据<---");
    }

    /**
     * ⑤ 同步神策访客浏览汇总数据
     * @date 2022-05-26 将访客浏览数据改为准实时同步
     * @return 是否同步
     */
    @Override
    public Boolean syncSaDataBoardTotals() {
        log.info("--->Ma 5、开始同步神策访客浏览汇总数据<---");
        List<MaTotalDataBoardEntity> entities = clientService.getSaDataBoardTotals();
        if(CollUtil.isNotEmpty(entities)) {
            log.info("--->Ma 5、神策访客浏览汇总数据:{}条,进行同步<---", entities.size());
            totalDataBoardService.saveOrUpdateBatch(entities);
            log.info("--->Ma 5、结束同步神策访客浏览汇总数据<---");
            return Boolean.TRUE;
        }
        log.info("--->Ma 5、神策访客浏览汇总数据:0条,无需同步<---");
        log.info("--->Ma 5、结束同步神策访客浏览汇总数据<---");
        return Boolean.FALSE;
    }

}
